Oxoscript se transforme en NanoPy - plus d'infos

Fonctions graphiques 3D

rotateAroundAxis

  rotateAroundAxis(angle:float, axis:vector3D)

Dans les applications plus complexes, il est pratiquement impossible d’effectuer une rotation autour d’un axe de rotation spécifique en utilisant uniquement la fonction rotate3D(). Pour cette raison, la fonction rotateAroundAxis() a été implémentée.

Cette fonction fera tourner le cadre actuel le long d’un axe spécifié par l’utilisateur (vecteur 3D) par un angle donné (en rad).

Elle fonctionne également en mode LOCAL ou GLOBAL en fonction du paramètre rotationMode().

axis = vector3D(x=1,y=2,z=0.5)
rotateAroundAxis(PI/4, axis)

setWorldRotation3D

  setWorldRotation3D(rotation:rotation3D)

Pour les applications 3D plus élaborées, il est utile de pouvoir écrire et lire la rotation actuelle du monde.

Cette fonction écrit une rotation du monde précédemment lue.

rotation:rotation3D
rotation = getWorldRotation3D()
setWorldRotation3D(rotation)

getWorldRotation3D

  getWorldRotation3D()->rotation3D

Pour les applications 3D plus élaborées, il est utile de pouvoir écrire et lire la rotation actuelle du monde.

Cette fonction renvoie un objet/classe rotation3D (par référence).

rotation:rotation3D
rotation = getWorldRotation3D()

rotationMode

  rotationMode(mode:byte)

Il est parfois plus facile de penser dans le cadre du monde (surtout lorsqu’il s’agit de rotations consécutives).

Tu pouves définir le cadre de référence de la rotation sur LOCAL (par défaut) ou GLOBAL.

rotationMode(LOCAL)
rotationMode(GLOBAL)

translationMode

  translationMode(mode:byte)

Il est parfois plus facile de penser dans le cadre du monde (surtout lorsqu’il s’agit de rotations consécutives).

Tu pouves définir le cadre de référence de la translation sur LOCAL (par défaut) ou GLOBAL.

translationMode(LOCAL)
translationMode(GLOBAL)

render

  render()

Toutes les formes 3D sont dessinées par-dessus les éléments 2D. Cela est dû à l’appel automatique de render() dans la fonction update().

Si tu souhaites dessiner des éléments 2D par-dessus des formes 3D, tu pouves appeler render() manuellement après le dessin des formes 3D.

fill(230, 204, 57)
background(162, 9, 176)
textFont(FONT_ROBOTO_BOLD_64)
drawSphere(3)
stroke(0, 0, 0)
drawText(26, 90, "Sphere") # ce texte noir sera derrière la sphère
render()
stroke(255, 255, 255)
drawText(20, 80, "Sphere") # ce texte blanc sera devant la sphère
update()

addVertex3D

  addVertex3D(x:float, y:float, z:float)

Cette fonction ajoute un point à l’emplacement x/y/z dans une définition de polygone.

Exemple: voir beingShape3D()

endShape3D

  endShape3D()

Cette fonction permet de fermer une définition de polygone.

Lorsque endShape3D() est appelée, le polygone est dessiné dans le tampon de l’écran.

Exemple: voir beginShape3D()

beginShape3D

  beginShape3D()

Démarre une définition de polygone. Cela consiste en un beginShape3D(), plusieurs appels à addVertex3D() et une fin avec endShape3D().

Exemple:

const l = 1.06 # 0.1 ... 2.0

fill(255,255,255)

def onDraw():
    clear()
    rotateY(0.02)
    beginShape3D() # face 1
    addVertex3D(l, l, l)
    addVertex3D(-l, l, -l)
    addVertex3D(-l, -l, l) # face 2
    addVertex3D(l, l, l)
    addVertex3D(-l, -l, l)
    addVertex3D(l, -l, -l) # face 3
    addVertex3D(-l, -l, l)
    addVertex3D(-l, l, -l)
    addVertex3D(l, -l, -l) # face 4
    addVertex3D(-l, l, -l)
    addVertex3D(l, l, l)
    addVertex3D(l,-l, -l)
    endShape3D()
    update()

Cet exemple dessine un simple tétraèdre à quatre faces tournant dans l’espace.

drawShape3D

  drawShape3D(vertices:float[], triangles:int[])

Tu pouves créer et rendre des formes 3D personnalisées à l’aide de la fonction drawShape3D().

Chaque forme est constituée d’une liste de sommets (emplacements dans l’espace 3D) et d’une liste de triangles/faces entre ces sommets.

image

Exemple:

verts:float[30] = [
    -1,-1,-1,
    1,-1,-1,
    1,1,-1,
    -1,1,-1,
    -1,-1,1,
    1,-1,1,
    1,1,1,
    -1,1,1,
    0,-1,2,
    0,1,2
]
tris:int[48] = [
    0,1,4,
    1,5,4,
    1,2,5,
    2,6,5,
    2,3,6,
    3,7,6,
    3,0,7,
    0,4,7,
    0,3,2,
    0,2,1,
    4,5,8,
    6,7,9,
    5,6,8,
    7,4,9,
    4,8,9,
    6,9,8
]

fill(255,255,255)
rotateX(-PI_DIV2)
scaleZ(0.8)

def onDraw():
    clear()
    rotateZ(0.02)
    drawOrigin()
    drawShape3D(verts, tris)
    update()

rotateCameraZ

  rotateCameraZ(z:float)

Identique à rotateCamera3D(x, y, z) mais en faisant pivoter la caméra autour de l’axe Z.

fill(255,255,255)
def onDraw():
    clear()
    rotateCameraZ(0.1)
    drawCube(2)
    update()

rotateCameraY

  rotateCameraY(y:float)

Identique à rotateCamera3D(x, y, z) mais en faisant pivoter la caméra autour de l’axe Y uniquement.

fill(255,255,255)
def onDraw():
    clear()
    rotateCameraY(0.1)
    drawCube(2)
    update()

rotateCameraX

  rotateCameraX(x:float)

Identique à rotateCamera3D(x, y, z) mais en faisant pivoter la caméra autour de l’axe X uniquement.

fill(255,255,255)
def onDraw():
    clear()
    rotateCameraX(0.1)
    drawCube(2)
    update()

rotateCamera3D

  rotateCamera3D(x:float, y:float, z:float))

Outre l’utilisation de rotate3D() pour faire pivoter l’ensemble du cadre (monde), tu pouves également utiliser cette fonction pour faire pivoter la caméra.

La fonction est additive. Chaque appel supplémentaire déplace le point zéro par rapport à la position précédente. Si on ne le souhaite pas, on peut utiliser push()/pop(), qui rétablit l’état initial.

Contrairement aux objets 2D, les fonctions translate et rotate sont la seule option pour définir la position des formes 3D.

scaleZ

  scaleZ(z:float)

Identique à scale3D(x, y, z) mais avec une mise à l’échelle uniquement sur l’axe Z.

fill(255,255,255)
rotateY(PI/2)
def onDraw():
    push()
    for i in 100:
        clear()
        scaleZ(0.99)
        drawSphere(4)
        update()
    pop()

scaleY

  scaleY(y:float)

Identique à scale3D(x, y, z) mais avec une mise à l’échelle uniquement sur l’axe Y.

fill(255,255,255)
def onDraw():
    push()
    for i in 100:
        clear()
        scaleY(0.99)
        drawSphere(4)
        update()
    pop()

scaleX

  scaleX(x:float)

Identique à scale3D(x, y, z) mais avec une mise à l’échelle uniquement sur l’axe X.

fill(255,255,255)
def onDraw():
    push()
    for i in 100:
        clear()
        scaleX(0.99)
        drawSphere(4)
        update()
    pop()

scale3D

  scale3D(x:float, y:float, z:float)

Met à l’échelle toutes les commandes de dessin suivantes par la valeur spécifiée. Par exemple, la taille double avec la valeur 2 ou diminue de moitié avec 0,5.

Remarque: scale3D() est multiplicatif. Cela signifie que, par exemple, scale3D(2) et scale3D(1,5) produisent ensemble le même effet qu’une seule scale3D(3).

Exemple:

fill(255,255,255)
drawSphere(1)
update()
delay(1000)

scale3D(2,2,2)
drawSphere(1)
update()
delay(1000)

scale3D(1.5,1.5,1.5)
drawSphere(1)
update()

translateCameraZ

  translateCameraZ(z:float)

Identique à translateCamera3D(x, y, z) mais en déplaçant uniquement l’axe Z de la caméra.

fill(255,255,255)
translateCameraZ(-5)
def onDraw():
    for i in 100:
        clear()
        translateCameraZ(0.1)
        drawCube(2)
        update()
    translateCameraZ(-10)

translateCameraY

  translateCameraY(y:float)

Identique à translateCamera3D(x, y, z) mais en déplaçant uniquement l’axe Y de la caméra.

fill(255,255,255)
translateCameraY(-5)
def onDraw():
    for i in 100:
        clear()
        translateCameraY(0.1)
        drawCube(2)
        update()
    translateCameraY(-10)

translateCameraX

  translateCameraX(x:float)

Identique à translateCamera3D(x, y, z) mais en déplaçant uniquement l’axe X de la caméra.

fill(255,255,255)
translateCameraX(-5)
def onDraw():
    for i in 100:
        clear()
        translateCameraX(0.1)
        drawCube(2)
        update()
    translateCameraX(-10)

translateCamera3D

  translateCamera3D(x:float, y:float, z:float)

Outre l’utilisation de translate3D() pour déplacer l’ensemble du cadre (monde), tu pouves également utiliser cette fonction pour déplacer la position de la caméra.

La fonction est additive. Chaque appel supplémentaire déplace le point zéro par rapport à la position précédente. Si on ne le souhaite pas, on peut utiliser push()/pop(), qui rétablit l’état initial.

Contrairement aux objets 2D, les fonctions translate et rotate sont la seule option pour définir la position des formes 3D.

rotateZ

  rotateZ(z:float)

Identique à rotate3D(x, y, z) mais avec une rotation uniquement autour de l’axe Z.

fill(255,255,255)
def onDraw():
    clear()
    rotateZ(0.1)
    drawCube(2)
    update()

rotateY

  rotateY(y:float)

Identique à rotate3D(x, y, z) mais avec une rotation uniquement autour de l’axe Y.

fill(255,255,255)
def onDraw():
    clear()
    rotateY(0.1)
    drawCube(2)
    update()

rotateX

  rotateX(x:float)

Identique à rotate3D(x, y, z) mais avec une rotation uniquement autour de l’axe X.

fill(255,255,255)
def onDraw():
    clear()
    rotateX(0.1)
    drawCube(2)
    update()

rotate3D

  rotate3D(x:float, y:float, z:float)

Utilises cette fonction pour faire tourner le cadre actuel (monde) autour du point d’origine.

La fonction est additive. Chaque appel supplémentaire déplace le point zéro par rapport à la position précédente. Si on ne le souhaite pas, on peut utiliser push()/pop(), qui rétablit l’état initial.

Contrairement aux objets 2D, les fonctions translate et rotate sont la seule option pour définir la position des formes 3D.

translateZ

  translateZ(z:float)

Identique à translate3D(x, y, z) mais en déplaçant uniquement l’axe Z.

fill(255,255,255)
translateZ(-5)
def onDraw():
    for i in 100:
        clear()
        translateZ(0.1)
        drawCube(2)
        update()
    translateZ(-10)

translateY

  translateY(y:float)

Identique à translate3D(x, y, z) mais avec une translation uniquement sur l’axe Y.

fill(255,255,255)
translateY(-5)
def onDraw():
    for i in 100:
        clear()
        translateY(0.1)
        drawCube(2)
        update()
    translateY(-10)

translateX

  translateX(x:float)

Identique à translate3D(x, y, z) mais avec une translation uniquement sur l’axe X.

fill(255,255,255)
translateX(-5)
def onDraw():
    for i in 100:
        clear()
        translateX(0.1)
        drawCube(2)
        update()
    translateX(-10)

translate3D

  translate3D(x:float, y:float, z:float)

Utilises cette fonction pour déplacer le cadre actuel (monde).

La fonction est additive. Chaque appel supplémentaire déplace le point zéro par rapport à la position précédente. Si on ne le souhaite pas, on peut utiliser push()/pop(), qui rétablit l’état initial.

Contrairement aux objets 2D, les fonctions translate et rotate sont la seule option pour définir la position des formes 3D.

drawTriangularPrism

  drawTriangularPrism(r:float, h:float)

Dessine une forme 3D: Prisme triangulaire

fill(255,255,255)
rotate3D(-PI/4, -PI/4, 0)
drawTriangularPrism(2, 3)
update()

drawCylinder

  drawCylinder(r:float, h:float)

Dessine une forme 3D: Cylindre

fill(255,255,255)
rotate3D(-PI/4, -PI/4, 0)
drawCylinder(2, 3)
update()

drawCuboid

  drawCuboid(w:float, l:float, h:float)

Dessine une forme 3D: Cuboïde

fill(255,255,255)
rotate3D(0, PI/4, 0)
drawCuboid(3, 2, 1)
update()

drawSphere

  drawSphere(size:float)

Dessine une forme 3D: Sphère

fill(255,255,255)
drawSphere(2)
update()

drawCube

  drawCube(size:float)

Dessine une forme 3D: Cube

fill(255,255,255)
rotate3D(0,PI/4,0)
drawCube(2)
update()

drawOrigin

  drawOrigin()

Cette fonction dessine un cadre de coordonnées où chaque axe a une longueur de 1 mètre/unité.

Par convention, x est rouge, y est vert et z est bleu.

Utilises par exemple translate3D() ou rotate3D() pour modifier la position de l’origine.